/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Modelo.Algoritmos;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
/**
 *
 * @author Rodrigo
 */
public class Galleta {
    
    //galleta precio factordemanda numerogalletasdemandadas
    private int idgalleta;
    private TipoGalleta tipogalleta;
    private int numGalletasPedidas;
    private int demandacubierta;
    private int[] inv_ini_proc; 
    private int[] demanda_maq_pedida;
    private int[] demanda_maq_cubierta;
    private int[] inv_nuevo;
    
    /**
     * @return the idgalleta
     */
    public Galleta() {
        
    }

    public Galleta(Tipoproducto galleta ){
        //idgalleta = galleta.getIdtipoproducto();
        
        
    }
    
    public Galleta(int id, TipoGalleta tipo, int num) {
        idgalleta = id;
        tipogalleta = tipo;
        numGalletasPedidas = num;
        this.inv_ini_proc = new int[tipogalleta.getMaquinasProceso().size()];
        this.demanda_maq_pedida = new int[tipogalleta.getMaquinasProceso().size()];
        this.demanda_maq_cubierta = new int[tipogalleta.getMaquinasProceso().size()];
        this.inv_nuevo = new int[tipogalleta.getMaquinasProceso().size()];
    }

    public Galleta ( int id, TipoGalleta tipo, int num, int[] ini, int[] dem_maq_cub, int[] dem_maq_ped, int[] ininuevo){
        idgalleta = id;
        tipogalleta = tipo;
        numGalletasPedidas = num;
        int[] ini2 = new int[ini.length];
        int[] dem2 = new int[ini.length];
        int[] demm2 = new int[ini.length];
        int[] ininuevo2 = new int[ini.length];
        for(int i=0;i < ini.length;i++){
            ini2[i] = ini[i];
            dem2[i] = dem_maq_cub[i];
            demm2[i] = dem_maq_ped[i];
            ininuevo2[i] = ininuevo[i];
        }
        this.inv_ini_proc = ini2;
        this.demanda_maq_pedida= dem2;
        this.demanda_maq_cubierta = demm2;
        this.inv_nuevo= ininuevo2;
    }
    /**
     * @return the demanda_maq_cubierta
     */
    public int[] getDemanda_maq_cubierta() {
        return demanda_maq_cubierta;
    }

    /**
     * @param demanda_maq_cubierta the demanda_maq_cubierta to set
     */
    public void setDemanda_maq_cubierta(int[] demanda_maq_cubierta2) {
        this.demanda_maq_cubierta=demanda_maq_cubierta2;
    }

    
    public int[] getDemanda_maq_pedida() {
        return demanda_maq_pedida;
    }
    public void setdemanda_maq_pedida(int[] demanda_maq_pedida2) {
        this.demanda_maq_pedida = demanda_maq_pedida2;
    }
    
    
    public void calcDemMaqPedido(){
    
        for(int i=0;i < getInv_nuevo().length;i++){
            getInv_nuevo()[i] = this.inv_ini_proc[i];
        }
        int fin;
        fin = this.demanda_maq_pedida.length -1;
        if(getInv_nuevo()[fin]< numGalletasPedidas){
        demanda_maq_pedida[fin] = numGalletasPedidas - getInv_nuevo()[fin];
            getInv_nuevo()[fin]=0;
        }
        else {
            demanda_maq_pedida[fin] =0;
            getInv_nuevo()[fin] = getInv_nuevo()[fin] - numGalletasPedidas ;  
        }
        
      
        for(int i = fin -1 ; i>=0; i--){
        if(demanda_maq_pedida[i+1]> getInv_nuevo()[i]){
         demanda_maq_pedida[i] = demanda_maq_pedida[i+1] - getInv_nuevo()[i];
                getInv_nuevo()[i] =0;
        }
        else {
            demanda_maq_pedida[i] =0;
                getInv_nuevo()[i] = getInv_nuevo()[i] - demanda_maq_pedida[i+1];
            }
        }
      
    }
    
//    
    public int[] getInv_ini_proc() {
        return inv_ini_proc;
    }
    public void setInv_ini_proc(int[] inv_ini_proc2) {
        this.inv_ini_proc= inv_ini_proc2;
    }
    
    
    public int getIdgalleta() {
        return idgalleta;
    }

    /**
     * @param idgalleta the idgalleta to set
     */
    public void setIdgalleta(int idgalletaa) {
        this.idgalleta = idgalletaa;
    }

    public double calcularUtilidad() {
        double utilidad;
        utilidad = getNumGalletasPedidas() * (tipogalleta.getPrecio() - tipogalleta.getCosto());
        return utilidad;
    }

    /**
     * @return the numGalletasPedidas
     */
    public int getNumGalletasPedidas() {
        return numGalletasPedidas;
    }

    /**
     * @param numGalletasPedidas the numGalletasPedidas to set
     */
    public void setNumGalletasPedidas(int numGalletasPedidaas) {
        this.numGalletasPedidas = numGalletasPedidaas;
    }

    /**
     * @return the tipogalleta
     */
    public TipoGalleta getTipogalleta() {
        return tipogalleta;
    }

    /**
     * @param tipogalleta the tipogalleta to set
//     */
 public void setTipogalleta(TipoGalleta tipogalletaa) {
        this.tipogalleta = tipogalletaa;
//         this.setDemanda_maq_cubierta(new int[tipogalleta.getMaquinasProceso().size()]);
//        this.setDemanda_maq_pedida(new int[tipogalleta.getMaquinasProceso().size()]);
//        this.setInv_ini_proc(new int[tipogalleta.getMaquinasProceso().size()]);
//        
  }

    /**
     * @return the demandacubierta
     */
    public int getDemandacubierta() {
        return demandacubierta;
    }

    /**
     * @param demandacubierta the demandacubierta to set
     */
    public void setDemandacubierta(int demandacubierta2) {

        this.demandacubierta = demandacubierta2;
    }

    public void calcularDemandacubierta(int[] arr) {
        int menor = cubiertoMenor(arr);
        if (menor >= this.numGalletasPedidas) {
            this.   demandacubierta = numGalletasPedidas;
        } else {
            this.demandacubierta = menor;
        }
    }

    public void calDemCubV2(){
       
        this.demandacubierta = demanda_maq_cubierta[demanda_maq_cubierta.length -1];
//         if(demanda_maq_cubierta[demanda_maq_cubierta.length -1]> this.numGalletasPedidas){
//            this.demandacubierta = numGalletasPedidas;
//            this.demanda_maq_cubierta[demanda_maq_cubierta.length -1] = this.numGalletasPedidas;
//        }
        
    }
    
    public void actualizaDemCub(int k, int num){
       demanda_maq_cubierta[k] = demanda_maq_cubierta[k] + num;
//         if( demanda_maq_cubierta[k] > this.demanda_maq_pedida[k]) this.demanda_maq_cubierta[k] = this.demanda_maq_pedida[k];
        
      //if(demanda_maq_cubierta[k]>demanda_maq_pedida[k] ) demanda_maq_cubierta[k] = demanda_maq_pedida[k];
    }
    
    public int cubiertoMenor(int[] arr) {

        int menor = 9999999;

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < menor) {
                menor = arr[i];
            }
        }

        return menor;
    }
    
    
    public boolean verificaDemCub(){// verificamos que aun no se haya cubierto la demanda
    
    for(int i=0;i < demanda_maq_cubierta.length ;i++) {
            if( demanda_maq_cubierta[i] < demanda_maq_pedida[i]) return true;
      }
     return false;
    }
    
    public boolean verifNODemCubProc(int i){
    
    if(demanda_maq_cubierta[i]< demanda_maq_pedida[i] ) return true;
            else return false;
    }
    
  public boolean maquinasDisponibles(Maquinas maquinas){
      int resultado =0;
      if(this.tipogalleta.getMaquinasProceso().size() == 2){
          if(maquinas.maqHorneado.isEmpty()) resultado = resultado+1;
          if(maquinas.maqEmpaquetado.isEmpty()) resultado =resultado+1;
          if(resultado == 2) return false;
          else return true;
      }
      else 
          if(this.tipogalleta.getMaquinasProceso().size() == 3){
           if(this.tipogalleta.getIdTipo() == 11){
              if(maquinas.maqHorneado.isEmpty()) resultado=resultado+1;
              if(maquinas.maqRellenado.isEmpty()) resultado=resultado+1;
              if(maquinas.maqEmpaquetado.isEmpty()) resultado =resultado+1;
              if(resultado == 3) return false;
              else return true;
          }else if(this.tipogalleta.getIdTipo() == 12){
          if(maquinas.maqHorneado.isEmpty()) resultado=resultado+1;
              if(maquinas.maqDecorado.isEmpty()) resultado=resultado+1;
              if(maquinas.maqEmpaquetado.isEmpty()) resultado =resultado+1;
              if(resultado == 3) return false;
              else return true;
          }
      }
        return false;
  
  }

    /**
     * @param inv_ini_proc the inv_ini_proc to set
     */
//    public void setInv_ini_proc(int[] inv_ini_proc) {
//        this.inv_ini_proc = inv_ini_proc;
//    }

    /**
     * @param demanda_maq_pedida the demanda_maq_pedida to set
     */
    public void setDemanda_maq_pedida(int[] demanda_maq_pedida) {
        this.demanda_maq_pedida = demanda_maq_pedida;
    }

    /**
     * @param demanda_maq_cubierta the demanda_maq_cubierta to set
     */
//    public void setDemanda_maq_cubierta(int[] demanda_maq_cubierta) {
//        this.demanda_maq_cubierta = demanda_maq_cubierta;
//    }

    /**
     * @return the inv_nuevo
     */
    public int[] getInv_nuevo() {
        return inv_nuevo;
    }

    /**
     * @param inv_nuevo the inv_nuevo to set
     */
    public void setInv_nuevo(int[] inv_nuevo) {
        this.inv_nuevo = inv_nuevo;
    }
    
    
}
